from PIL import Image
import csv
import cv2
import modulos
import numpy as np
from collections import OrderedDict
from collections import Counter
import argparse
import os

np.seterr(all='ignore') 

parser = argparse.ArgumentParser(description='Reconhecimento de individuos')
	
parser.add_argument('-l', '--limitei',help = 'limite para validacao do reconhecimento <= 200',default = 150)
parser.add_argument('-f', '--ficheiro',help = 'caminho completo do ficheiro',required =True)
args = parser.parse_args()

limite = int(args.limitei)

#pemite o print de toda a maytrix
np.set_printoptions(threshold=np.nan)

reader = csv.reader(open("facevector.csv", "rb"))

#le ficheiro da linha de comando 

file=""+args.ficheiro+""
im = cv2.imread(file, cv2.CV_LOAD_IMAGE_GRAYSCALE)

md = 3 					# Dimensao da mascara de gauss

ranking={}				# Ranking das personas 

# Cria uma nova imagem com as mascaras de kirsh - auxk.png
im = modulos.mascara_k(im)

imk = cv2.imread("auxk.pgm", cv2.CV_LOAD_IMAGE_GRAYSCALE)

minimof=''

#Cria vetores para os tres valores de sigma
for sig in [1.0,1.3,1.6]:
	
	k = (3.0/4.0)*sig	# Offset em relacao ao centro

	# Devolve uma mascara de gauss (G_sigma)
	img = modulos.f_gauss(md,sig)
						
	# Devolve uma mascara da derivada de gauss (G'_sigma)
	imdg = modulos.d_gauss(md,sig,k)
			
	# Devolve a Mascara de gauss (M_sigma)
	immg = modulos.m_gauss(md,img,imdg)
			
	# Cria uma nova imagem com a mascara de Gauss - aux2.png
	im1 = modulos.mascara_g(imk,immg)
			
	#Divide a imagem se x for superior 200 pixeis 
	imqua = modulos.crop("auxg.pgm")
	
	for nimax in range (0,imqua):
		for nimay in range (0,imqua):
			im = Image.open("ima"+str(nimax)+str(nimay)+".pgm")
			hist = map(int,im.histogram())
			npim= np.array(hist) # Histograma de cada imagem de prova 
				
			for row in reader:
				foto = row[0]
				sigma1 = row[1]	
				nvetor= row[2]
				vetor= row[3]
		
				#Histograma de cada vetor da base de dados
				vetorbd = modulos.matrizar(vetor)
				#funcao de comparacao 
				x2 = modulos.xquadrado(vetorbd,npim)
				
				if x2 < limite:
					limite = x2
					print limite
					minimof = foto
					lista= foto.split("/")
					print lista
					if (str(lista[0]) in ranking):
						ranking[str(lista[0])] += 1
					else:
						d1 = {str(lista[0]):1}
						ranking.update(d1)
						#print ranking


aa = OrderedDict(sorted(ranking.items(), key=lambda t: t[1]))
aa=Counter(aa).most_common()

os.system('clear')
if minimof <> '':	
	print 'Imagem de prova'
	print file
	prova = cv2.imread(file, cv2.CV_LOAD_IMAGE_GRAYSCALE)
	cv2.imshow("Imagem prova",prova)
	
	caminho=os.getcwd()
	file=""+caminho+"/orl_faces/"+aa[0][0]+"/1.pgm"	
	print
	print 'Imagem da base de dados'
	print file
	final = cv2.imread(file, cv2.CV_LOAD_IMAGE_GRAYSCALE)
	cv2.imshow("Resultado mais provavel",final)
	
	print
	print 'Valor da correspondencia: ' + str(limite)
	print 'Carrega em qualquer tecla para continuar...'
	cv2.waitKey(0)
else:
	print 'Foto sem correspondencia'




